package cn.ava.ymcc.service.impl;

import cn.ava.ymcc.domain.CourseType;
import cn.ava.ymcc.dto.CourseTypeDto;
import cn.ava.ymcc.mapper.CourseTypeMapper;
import cn.ava.ymcc.service.ICourseTypeService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author ava
 * @since 2022-08-09
 */
@Service
@RefreshScope
@Slf4j
@CacheConfig(cacheNames = "courseTypeTree")
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    @Autowired
    private CourseTypeMapper courseTypeMapper;

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @Value("${constant.redis-key}")
    private String key;

    /**
     * @Title: getTreeData
     * @Description: 从redis中获取数据,防止高并发风险,提高可用性
     * @Author: Avavaava
     * @Version: 23.53
     * @Date: 2022/8/10 18:08
     * @param:
     * @return:
     */
    @Override
    @Cacheable
    public List getTreeData() {
        log.info("查询数据库");
        return TreeData();
    }

    @Override
    @CacheEvict
    public boolean updateById(CourseType entity) {
        return super.updateById(entity);
    }

    @Override
    @CacheEvict
    public boolean insert(CourseType entity) {
        return super.insert(entity);
    }

    @Override
    @CacheEvict
    public boolean deleteById(Serializable id) {
        return super.deleteById(id);
    }

    /**
     * @Title: getTreeData
     * @Description: 获取课程树
     * @Author: Avavaava
     * @Version: 23.53
     * @Date: 2022/8/9 17:55
     * @param:
     * @return:
     */
    public List<CourseTypeDto> TreeData() {
        // 查询出全部数据
        List<CourseType> courseTypes = selectList(null);
        // 创建空集合
        List<CourseTypeDto> courseTypeDto = new ArrayList<>();
        // 用于查找父级
        HashMap<Long, CourseTypeDto> courseTypeDtoHashMap = new HashMap<>();
        // 返回的集合
        List<CourseTypeDto> courseTypeResult = new ArrayList<>();
        // 循环遍历数据,转换为dto数据,放入到空集合中
        courseTypes.forEach(courseType ->  {
            CourseTypeDto dto = new CourseTypeDto();
            BeanUtils.copyProperties(courseType,dto);
            dto.setChildren(new ArrayList<>()); // 防止空指针
            dto.setLabel(courseType.getName());
            // 放入到空集合中
            courseTypeDto.add(dto);
            courseTypeDtoHashMap.put(dto.getId(),dto);
        });

        // 循环转换之后的dto数据
        for (CourseTypeDto dto : courseTypeDto) {
            // 通过map找到父级
            CourseTypeDto data = courseTypeDtoHashMap.get(dto.getPid());
            // 判断如果为空,那么就是父级
            if (data == null) {
                // 放入到需要返回的集合中
                courseTypeResult.add(dto);
                // 跳过这次循环
                continue;
            }
            // 否则就是子级
            data.getChildren().add(dto);
        }
        // 返回树数据
        return courseTypeResult;
    }
}
